package org.dromara.tearoom.util;

import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.tearoom.mqtt.BreakerCallback;
import org.dromara.tearoom.mqtt.MqttConfig;
import org.dromara.tearoom.service.ITerIotDeviceService;

import java.util.List;

/**
 * Mqtt工具类
 * @author CKJ
 * @description: Mqtt工具类
 * @date 2025/4/15 18:39
 */
@Slf4j
public class MqttUtil {
    private static MqttConfig mqttConfig;

    public static MqttConfig getMqttConfig() {
        if (mqttConfig == null)
            mqttConfig = SpringUtils.getBean(MqttConfig.class);
        return mqttConfig;
    }



    //初始化 订阅
    public static void subscribeInit(){
        ITerIotDeviceService terIotDeviceService=SpringUtils.getBean(ITerIotDeviceService.class);
        List<String> deviceVoList=terIotDeviceService.getAllMqttPublish();
        // 一个mqtt 不可能只服务一种类型的设备  也许还有别的 所以 回调地址 根据需求 一一扩展即可
        // 只是以断路器 举例  也许项目里还有空调设备 门禁设备 都在这里扩展即可在回调地址里 找不同的实现类处理业务
        //  断路器 品牌1
        log.info("订阅主题:{}条",deviceVoList.size());
        if(CollUtil.isNotEmpty(deviceVoList)){
            deviceVoList.stream().forEach(item->{
                getMqttConfig().subscribe(item, 0,new BreakerCallback());
            });
        }
    }

    //订阅
    public static void subscribeInit(String MqttPublish){
        getMqttConfig().subscribe(MqttPublish, 0,new BreakerCallback());
    }




    /**
     * 发送消息
     * qos 0 最多一次传递  1 至少一次传递  2 仅一次传递
     * retained  true 保留消息  false 非保留消息
     * topic    主题
     * message  内容
     */
    public static boolean sendMqttMsg(int qos, boolean retained, String topic, String message) {
        try {
            return getMqttConfig().publish(qos, retained, topic, message);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("MQtt发送消息报错：" + e.getMessage());
            return false;
        }
    }

    /*
     * topic 主题
     * message 内容
     * */
    public static boolean sendMqttMsg(String topic, String message) {
        return sendMqttMsg(1, false, topic, message);
    }

}
